很快的,這次的鐵人競賽就到尾聲了。
在eBPF程式裡面要與kernel交互很重要的是helper function,因此在最後的兩天時間,我們要把所有的helper function速覽過一遍。這邊介紹以bpf-helper的man文件的內容為主,部分的helper function可能因為文件更新而有遺漏。
接下來的介紹會稍微對helper function做一定程度的分類,但是具體不同的eBPF program type 支援那些helper function可能還是要根據bcc文件、每個helper function對應的commit資訊等查詢。
今天會先介紹非網路相關的helper function,明天則會介紹網路相關的部分。
array, map類型map的操作函數,對應到查詢、插入或更新、刪除map內的元素。其中update可以透過flag (BPF_NOEXIST
, BPF_EXIST
, BPF_ANY
)決定key是不是不能先存在或一定要存在於map內。
用於stack, queue類型map的操作函數。
用於ringbuff的操作函數 (改進原本perf event map的問題)
生成隨機數
atol
, atoul
取得當前執行eBPF程式的(SMP) processor ID。由於eBPF是no preemption的所以在整個執行過程中processor id不會變。
取得當前NUMA (Non-uniform memory access) 的node id。受於匯流排限制,CPU核心可以比較快存取同節點上的memory,透過node id區分。通常是當attach的socket有啟用SO_ATTACH_REUSEPORT_EBPF
選項時會用到。
搭配BPF_MAP_TYPE_PROG_ARRAY
map去執行tail call。
取得開機到當下經過的時間,單位是ns,差別在於後者會多包含suspend(暫停)的時間
取得jiffies64
將字串訊息發送到 /sys/kernel/debug/tracing/trace ,主要用於開發除錯
寫入seq_file
搭配struct bpf_spin_lock
提供一個給BPF_MAP_TYPE_HASH
和BPF_MAP_TYPE_ARRAY
(目前只支援這兩著)裡面value使用的lock,由於一個map裡面只能有一個spin_lock,所以通常是使用把之前提過,整個map固定只有一個元素,把整個map當作一個global variable的用法
搭配BPF_MAP_TYPE_PERF_EVENT_ARRAY
使用,傳輸資料到user space
取得當前的tgid, uid, gid, command name, task structure
發signal到當前(process, thread)
用於讀取記憶體資料、字串及寫入記憶體。帶user的版本用於user space memory,其餘用於kernel space memory。
搭配BPF_MAP_TYPE_STACK_TRACE
使用,取得一個stack address hash過的stack id
取得userspace或kernel space的stack資料
搭配BPF_MAP_TYPE_PERF_EVENT_ARRAY
取得perf-event counter的讀數
用於BPF_PROG_TYPE_PERF_EVENT
取得struct perf_branch_entry
搭配BPF_MAP_TYPE_CGROUP_ARRAY
使用,檢查是否在某個cgroup v2節點內
查看當前上下文的cgroup節點的祖先節點id
取得當前上下文對應的cgroup id
用於kprobe,修改函數回傳值
取得一個當前network namespace對應的cookie (identifer)
取得local storage的指標 (cgroup相關可使用的一個儲存區)
用於BPF_PROG_TYPE_CGROUP_SYSCTL
本系列30天鐵人文章同步發表在我的個人部落格